var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var domain = require('domain');
var timeout = require('connect-timeout')

var index = require('./routes/index');
var users = require('./routes/users');
var redis = require('./db/redis');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(timeout('5s'))
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
	extended: false
}));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use(function(req, res, next) {
	console.log('reqDomain')
	var reqDomain = domain.create();
	reqDomain.on('error', function(err) {
		console.log(err.stack)
		try{
			res.status(500).send({'error': 'unkonow error, please feedback to support'});
		}catch(e){
			console.log(e)
		}
	});
	reqDomain.run(next);
});

app.use(function(req, res, next) {
	console.log('------ Filter Start ------')
	var deviceAgent = req.headers['user-agent'];
	var isMobile = deviceAgent.match(/(iphone|ipod|ipad|android)/i) != null ? true : false;
	res.locals._isMobile = isMobile;
	//res.header("Access-Control-Allow-Origin", "*");
	var at = req.headers['authorization'];
	res.locals._at = at;
	//res.header('Content-Type', 'application/json;charset=utf-8')
	console.log(req.url)
	//console.log(req.headers)
	console.log('------ Filter End ------\n');
	if(req.url.indexOf('login') == 1 
		|| req.url.indexOf('favicon.ico') == 1 
		//|| req.url.indexOf('socket.io') != -1
		|| req.url == '/') {
		next();
	} else {
		redis.getAt(at, function(err, reply) {
			if(err) {
				console.log(err)
			}
			//console.log(at);
			//console.log(req.headers)
			if(reply) {
				res.locals._user = reply;
				next();
			} else {
				res.status(401).json({
					'error': 'unauthorized'
				});
			}
		});
	}
});

app.use('/', index);
app.use('/users', users);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
	var err = new Error('Not Found');
	err.status = 404;
	next(err);
});

// error handler
app.use(function(err, req, res, next) {
	// set locals, only providing error in development
	res.locals.message = err.message;
	res.locals.error = req.app.get('env') === 'development' ? err : {};

	// render the error page
	res.status(err.status || 500);
	res.render('error');
});

module.exports = app;